# 导入蓝图
from flask import Blueprint, render_template, request, abort, flash, redirect, url_for,jsonify
from flask_login import login_required, current_user

from models import Question, QuestionTags
from questions.forms import WriteQuestionForm, AnswerWriteForm

qa=Blueprint('qa',__name__,template_folder="templates",static_folder='../assets')



# 首页
@qa.route('/')
def index():
    return render_template('index.html')

# 关注的问题
@qa.route('/follow')
def follow():
    # 每一页显示多少个关注的问题
    per_page=20
    # 获取get请求中，是第几页,如果没有写，默认是1
    page=int(request.args.get('page',1))
    # 每一页的问题的数量，但是是关注的，哦哦哦，有外键关联不用管
    # paginate是获取分页的数据，page是第几页，per_page是一页有多少个数据
    page_data=Question.query.filter_by(is_valid=True).paginate(page=page,per_page=per_page)
    return render_template('follow.html',page_data=page_data)


# 文章详情
@qa.route('/detail/<int:q_id>',methods=['GET','POST'])
def detail(q_id):
    # 通过q_id来进入到文件页中
    # 获取问题
    # question=Question.query.filter_by(id=q_id)
    question=Question.query.get(q_id)
    # 如果问题无效，报404
    if not question.is_valid:
        abort(404)
    # 问题的第一个答案
    answer=question.answer_list.filter_by(is_valid=True).first()
    # 获取问题的标签
    question_tag=QuestionTags.query.filter_by(is_valid=True,q_id=q_id)
    # 回答问题
    form = AnswerWriteForm()
    if request.method=="POST":
        if form.validate_on_submit():
            # 验证是否登录
            try:
                if not current_user.is_authenticated:
                    flash('请先登录','danger')
                    return redirect(url_for("accounts.login"))
                # 获取回答的obj
                answer_obj=form.save(question=question)
                flash("回答问题成功",'success')
                return redirect(url_for('qa.detail',q_id=q_id))
            except Exception as e:
                print(e)
    return render_template('detail.html',question=question,answer=answer,question_tag=question_tag,form=form)


# 写文章
@qa.route('/write',methods=['GET','POST'])
@login_required
def write():
    form=WriteQuestionForm()
    if request.method=='POST':
        if form.validate_on_submit():
            try:
                # 获取问题数据库的对象
                que_obj=form.save()
                if que_obj:
                    flash("发布问题成功",'success')
                    return redirect(url_for('qa.index'))
            except Exception as e:
                print(e)
            flash("发布问题失败，请稍后重试",'danger')
    return render_template('write.html',form=form)

# 获取问题数
@qa.route("/qa/list")
def question_list():
    try:
        # 每一页显示多少个关注的问题
        per_page=2
        # 获取get请求中，是第几页,如果没有写，默认是1
        page=int(request.args.get('page',1))
        # 每一页的问题的数量，但是是关注的，哦哦哦，有外键关联不用管
        # paginate是获取分页的数据，page是第几页，per_page是一页有多少个数据
        page_data=Question.query.filter_by(is_valid=True).paginate(page=page,per_page=per_page)
        data=render_template("follow_question.html",page_data=page_data)
        return jsonify({'code':0,"data":data})
    except Exception as e:
        print(e)
        return jsonify({'code':1})

